package cn.itcast.web.controller;

import cn.itcast.domain.system.Module;
import cn.itcast.domain.system.User;
import cn.itcast.service.system.ModuleService;
import cn.itcast.service.system.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.*;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

@Controller
public class LoginControllerr extends BaseController {
    @Autowired
    private UserService userService;
    @Autowired
    private ModuleService moduleService;

    //主页
    /*请求 http://localhost:8080/login.do
     参数
    返回  /home/main
    * */
    @RequestMapping("/login")
    public String login(String email, String password) {
        //0.判断email或password是否为空
        if (StringUtils.isEmpty(email) || StringUtils.isEmpty(password)) {
            return "redirect:/login.jsp";
        }
        //1.shiro框架需要 获取Subject对象
        Subject subject = SecurityUtils.getSubject();
        //2.shiro框架需要  封装认证信息（用户名和密码）
        AuthenticationToken token = new UsernamePasswordToken(email, password);
        try {
            //3.调用Subject的认证方法:login。只要login方法一执行，就会执行AuthRealm的认证方法
            subject.login(token);
            //4.1 如果认证成功（没有异常），把登录信息存入session，获取当前用户菜单，跳转到主页
            //4.1.1 AuthRealm自己实现
            //从AuthRealm获取认证的用户登录信息
            User user = (User) subject.getPrincipal();
            //把登录用户数据存入session中
            session.setAttribute("loginUser", user);
            //获取用户拥有模块
            //查询用户所拥有的模块
            HashSet<Module> module = moduleService.findModuleById(user.getId());
            List<Module> modules = new ArrayList<>();
            for (Module module1 : module) {
                modules.add(module1);
            }
            session.setAttribute("modules", modules);
            //4.1.4 跳转到主页
            return "home/main";

        } catch (UnknownAccountException e) {// UnknownAccountException: 用户不存在异常
            //4.2 如果认证不成功，提示用户
            //提示用户
            request.setAttribute("error","用户名不存在");
            return "forward:/login.jsp";

        }catch (IncorrectCredentialsException e){
            //提示用户
            request.setAttribute("error","密码输入不正确");
            return "forward:/login.jsp";
        }
    }



    /**
     * 注销
     *   路径：http://localhost:8080/logout.do
     *   参数：无
     *   返回： /login.jsp
     */
    @RequestMapping("/logout")
    public String logout(){

        //删除session登录数据
        session.removeAttribute("loginUser");
        //删除Shiro的session(底层：删除session数据)
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
        //销毁session
        //session.invalidate();

        return "redirect:/login.jsp";
    }

    /**
     * 主页内容显示
     *   访问路径：http://localhost:8080/home.do
     *   方法参数：无
     *   方法返回： /WEB-INF/pages/home/home.jsp
     */
@RequestMapping("/home")
public String home(){
        return"/home/home";
        }
        }
